Skip to content

Google OAuth2 소셜 로그인 및 JWT 발급 기능 구현#101

Merged
ckdals4600 merged 1 commit intomainfrom
feature/#8-google-login
Dec 23, 2025
Merged

Google OAuth2 소셜 로그인 및 JWT 발급 기능 구현#101
ckdals4600 merged 1 commit intomainfrom
feature/#8-google-login

Conversation

@ckdals4600
Copy link
Contributor

@ckdals4600 ckdals4600 commented Nov 23, 2025

관련 이슈

작업 내용

Spring Security OAuth2 Client를 이용하여 Google 소셜 로그인 기능을 구현했습니다. 로그인 성공 시 JWT(Access/Refresh Token)를 발급하여 클라이언트에게 전달하는 로직이 포함되어 있습니다.

1. Security 설정 (SecurityConfig)

  • oauth2Login() 설정을 활성화하여 소셜 로그인 필터 체인을 구성했습니다.
  • UserInfoEndpoint, SuccessHandler, FailureHandler를 각각 커스텀 구현체로 등록했습니다.
  • OAuth2 관련 설정값(Redirect URL 등) 관리를 위해 OAuth2Properties를 도입했습니다.

2. 사용자 정보 동기화 (CustomOAuth2UserService)

  • 구글 인증 서버로부터 받은 사용자 정보를 GoogleOAuth2User 레코드로 매핑합니다.
  • MemberCommandService.createOrUpdate()를 호출하여, 신규 사용자는 회원가입 처리하고 기존 사용자는 정보를 갱신하도록 구현했습니다.

3. 로그인 성공/실패 핸들링

  • 성공 시 (OAuth2SuccessHandler):
    • 인증된 이메일을 기반으로 Access Token과 Refresh Token을 생성합니다.
    • 생성된 토큰을 Cookie에 담아 클라이언트(프론트엔드)의 성공 페이지로 리다이렉트합니다.
  • 실패 시 (OAuth2FailureHandler):
    • OAuth2AuthenticationException 및 내부 BusinessException을 포착합니다.
    • 에러 상황에 맞는 AuthErrorCode를 파싱하여, 에러 코드와 함께 실패 페이지로 리다이렉트합니다.

4. 에러 코드 정의 (AuthErrorCode)

  • 소셜 로그인 과정에서 발생할 수 있는 예외(사용자 취소, 제공자 서버 오류, 유효하지 않은 요청 등)를 처리하기 위한 Enum 코드를 추가했습니다.

5. JaCoCo 설정

  • OAuth 관련 클래스들이 테스트 커버리지 집계에 제외되도록 하였습니다.

중요 알림 (로컬 테스트 관련)

  • 기존 일반 로그인/회원가입 API 유지: 프론트엔드 팀의 로컬 환경 테스트 및 개발 편의성을 위해, 소셜 로그인 외에 기존에 개발된 일반 로그인 및 회원가입 API 엔드포인트는 제거하지 않고 남겨두었습니다. 추후 배포 단계에서 제거 여부를 다시 논의할 예정입니다.

테스트 방법

  1. 로그인 시도
    • http://localhost:8080/oauth2/authorization/google 접속 -> 구글 로그인 -> http://localhost:3000/login/success... 리다이렉트 확인
  2. DB 확인
    • H2 Console 등에서 회원 정보(MEMBER 테이블) 저장 여부 확인
  3. 쿠키 확인
    • 개발자 도구(F12) Application 탭에서 accessToken, refreshToken 쿠키 생성 확인
  4. API 호출
    • Postman 등을 이용해 Bearer <accessToken> 헤더를 담아 인증 필요한 API 호출 -> 200 OK 확인

실행 결과

image image

@ckdals4600 ckdals4600 linked an issue Nov 23, 2025 that may be closed by this pull request
@ckdals4600 ckdals4600 self-assigned this Nov 23, 2025
@ckdals4600 ckdals4600 requested review from Goder-0 and minibr November 23, 2025 15:00
@ckdals4600 ckdals4600 force-pushed the main branch 3 times, most recently from 6a1b5bb to 870f8ed Compare December 15, 2025 09:00
@ckdals4600 ckdals4600 force-pushed the feature/#8-google-login branch from f278f98 to bd0bff1 Compare December 15, 2025 12:51
@minibr
Copy link
Contributor

minibr commented Dec 19, 2025

http://localhost:8080/oauth2/authorization/google

위 URL로 접속해서 OAuth2 로그인을 테스트해보니 다음과 같은 에러가 발생합니다:

{
"success": false,
"status": "UNAUTHORIZED",
"message": "로그인이 필요합니다.",
"data": "C-005",
"timestamp": "2025-12-19T23:35:14.792598"
}

OAuth2 경로가 PERMIT_URLS에 포함되어 있는데도 인증이 필요하다고 나오는데, 혹시 추가로 허용해야 할 경로가 있을까요?

@ckdals4600
Copy link
Contributor Author

http://localhost:8080/oauth2/authorization/google

위 URL로 접속해서 OAuth2 로그인을 테스트해보니 다음과 같은 에러가 발생합니다:

{ "success": false, "status": "UNAUTHORIZED", "message": "로그인이 필요합니다.", "data": "C-005", "timestamp": "2025-12-19T23:35:14.792598" }

OAuth2 경로가 PERMIT_URLS에 포함되어 있는데도 인증이 필요하다고 나오는데, 혹시 추가로 허용해야 할 경로가 있을까요?

제 환경에서는 정상적으로 접근이 가능합니다. 혹시 아직도 접근이 안되실까요 ?

@ckdals4600 ckdals4600 requested a review from Goder-0 December 19, 2025 16:18
@Goder-0
Copy link
Contributor

Goder-0 commented Dec 19, 2025

제 생각에는 login/oauth2/**이 SecurityConfig에 추가되어야 할 것 같은데 어떻게 생각하시나요?
redirection에 대한 고려가 필요해보입니다.

@ckdals4600
Copy link
Contributor Author

ckdals4600 commented Dec 19, 2025

제 생각에는 login/oauth2/**이 SecurityConfig에 추가되어야 할 것 같은데 어떻게 생각하시나요? redirection에 대한 고려가 필요해보입니다.

제안해 주신 부분 확인했습니다.

현재 리다이렉트 되는 경로( http://localhost:3000/login/success, http://localhost:3000/login/failure )는 백엔드 API 엔드포인트가 아니라 프론트엔드의 임의 라우팅 주소입니다.
해당 경로는 스프링 시큐리티의 필터 체인을 거치는 요청이 아니므로, SecurityConfig 설정에는 포함하지 않아도 무방할 것으로 판단됩니다.

또한 현재 주소는 개발 편의를 위한 임시 주소이며, 배포 시 실제 프론트 도메인으로 변경 예정입니다.

@Goder-0
Copy link
Contributor

Goder-0 commented Dec 20, 2025

현재 리다이렉트 되는 경로( http://localhost:3000/login/success, http://localhost:3000/login/failure )는 백엔드 API 엔드포인트가 아니라 프론트엔드의 임의 라우팅 주소입니다. 해당 경로는 스프링 시큐리티의 필터 체인을 거치는 요청이 아니므로, SecurityConfig 설정에는 포함하지 않아도 무방할 것으로 판단됩니다.

또한 현재 주소는 개발 편의를 위한 임시 주소이며, 배포 시 실제 프론트 도메인으로 변경 예정입니다.

제 의견이 잘못 전달되었습니다. 프론트의 redirection이 아닌 login/oauth2/** 는 code를 제공하는 redirection을 말씀드린 것이었습니다.
image

@minibr 이 디스코드 상에 공유해주신 사진을 보면, url이 서버쪽으로 redirection됩니다. 이 부분은 OAuth2LoginAuthenticationFilter의 콜백인 login/oauth2/**로 보입니다. 해당 파트가 추가되어야한다는 생각입니다.

@ckdals4600
Copy link
Contributor Author

제 의견이 잘못 전달되었습니다. 프론트의 redirection이 아닌 login/oauth2/** 는 code를 제공하는 redirection을 말씀드린 것이었습니다. image

@minibr 이 디스코드 상에 공유해주신 사진을 보면, url이 서버쪽으로 redirection됩니다. 이 부분은 OAuth2LoginAuthenticationFilter의 콜백인 login/oauth2/**로 보입니다. 해당 파트가 추가되어야한다는 생각입니다.

근데 해당 URL은 스프링 시큐리티가 내부적으로 가로채서 로그인 처리를 수행하는 특수한 URL이기 때문에 우리가 만든 컨트롤러에 도달하기 전에, Spring Security OAuth2LoginAuthenticationFilter가 먼저 가로채서 처리합니다. 따라서 authorizeHttpRequests 설정과 무관하게 필터 단에서 인증 로직이 수행됩니다.
해당 문제는 권한 문제가 아니라, 로그인 처리 과정에서 내부 에러가 발생해 처리가 중단되었다고 생각됩니다.
문제 해결을 위해 @minibr 브라우저 화면이 아니라 서버 콘솔 로그 제공을 부탁드립니다.

@Goder-0
Copy link
Contributor

Goder-0 commented Dec 20, 2025

근데 해당 URL은 스프링 시큐리티가 내부적으로 가로채서 로그인 처리를 수행하는 특수한 URL이기 때문에 우리가 만든 컨트롤러에 도달하기 전에, Spring Security OAuth2LoginAuthenticationFilter가 먼저 가로채서 처리합니다. 따라서 authorizeHttpRequests 설정과 무관하게 필터 단에서 인증 로직이 수행됩니다. 해당 문제는 권한 문제가 아니라, 로그인 처리 과정에서 내부 에러가 발생해 처리가 중단되었다고 생각됩니다. 문제 해결을 위해 @minibr 브라우저 화면이 아니라 서버 콘솔 로그 제공을 부탁드립니다.

직접 테스트 해본결과 정상동작하는 것으로 확인되었습니다. 해당 이슈는 redis 연결에 실패해 발생한 오류로 보입니다.

@ckdals4600 ckdals4600 requested a review from Goder-0 December 20, 2025 19:45
@ckdals4600 ckdals4600 force-pushed the feature/#8-google-login branch 3 times, most recently from 5f95258 to 25cbb26 Compare December 20, 2025 20:50
@ckdals4600 ckdals4600 force-pushed the feature/#8-google-login branch from 25cbb26 to 9a558b9 Compare December 20, 2025 21:04
@github-actions
Copy link

📊 코드 커버리지 리포트

Overall Project 87.79% -0.77% 🍏
Files changed 0%

File Coverage
MemberCommandService.java 36.11% -63.89%

@ckdals4600 ckdals4600 merged commit 6a50f7f into main Dec 23, 2025
1 check passed
@ckdals4600 ckdals4600 deleted the feature/#8-google-login branch January 6, 2026 05:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

구글 로그인 추가

3 participants